home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / WarpQuake / Src / gl_model.h < prev    next >
C/C++ Source or Header  |  2000-05-22  |  10KB  |  431 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20.  
  21. #ifndef __MODEL__
  22. #define __MODEL__
  23.  
  24. #include "modelgen.h"
  25. #include "spritegn.h"
  26.  
  27. /*
  28.  
  29. d*_t structures are on-disk representations
  30. m*_t structures are in-memory
  31.  
  32. */
  33.  
  34. // entity effects
  35.  
  36. #define    EF_BRIGHTFIELD            1
  37. #define    EF_MUZZLEFLASH             2
  38. #define    EF_BRIGHTLIGHT             4
  39. #define    EF_DIMLIGHT             8
  40.  
  41.  
  42. /*
  43. ==============================================================================
  44.  
  45. BRUSH MODELS
  46.  
  47. ==============================================================================
  48. */
  49.  
  50.  
  51. //
  52. // in memory representation
  53. //
  54. // !!! if this is changed, it must be changed in asm_draw.h too !!!
  55. typedef struct
  56. {
  57.     vec3_t        position;
  58. } mvertex_t;
  59.  
  60. #define    SIDE_FRONT    0
  61. #define    SIDE_BACK    1
  62. #define    SIDE_ON        2
  63.  
  64.  
  65. // plane_t structure
  66. // !!! if this is changed, it must be changed in asm_i386.h too !!!
  67. typedef struct mplane_s
  68. {
  69.     vec3_t    normal;
  70.     float    dist;
  71.     byte    type;            // for texture axis selection and fast side tests
  72.     byte    signbits;        // signx + signy<<1 + signz<<1
  73.     byte    pad[2];
  74. } mplane_t;
  75.  
  76. typedef struct texture_s
  77. {
  78.     char        name[16];
  79.     unsigned    width, height;
  80.     int            gl_texturenum;
  81.     struct msurface_s    *texturechain;    // for gl_texsort drawing
  82.     int            anim_total;                // total tenths in sequence ( 0 = no)
  83.     int            anim_min, anim_max;        // time for this frame min <=time< max
  84.     struct texture_s *anim_next;        // in the animation sequence
  85.     struct texture_s *alternate_anims;    // bmodels in frmae 1 use these
  86.     unsigned    offsets[MIPLEVELS];        // four mip maps stored
  87. } texture_t;
  88.  
  89.  
  90. #define    SURF_PLANEBACK        2
  91. #define    SURF_DRAWSKY        4
  92. #define SURF_DRAWSPRITE        8
  93. #define SURF_DRAWTURB        0x10
  94. #define SURF_DRAWTILED        0x20
  95. #define SURF_DRAWBACKGROUND    0x40
  96. #define SURF_UNDERWATER        0x80
  97.  
  98. // !!! if this is changed, it must be changed in asm_draw.h too !!!
  99. typedef struct
  100. {
  101.     unsigned short    v[2];
  102.     unsigned int    cachededgeoffset;
  103. } medge_t;
  104.  
  105. typedef struct
  106. {
  107.     float        vecs[2][4];
  108.     float        mipadjust;
  109.     texture_t    *texture;
  110.     int            flags;
  111. } mtexinfo_t;
  112.  
  113. #define    VERTEXSIZE    7
  114.  
  115. typedef struct glpoly_s
  116. {
  117.     struct    glpoly_s    *next;
  118.     struct    glpoly_s    *chain;
  119.     int        numverts;
  120.     int        flags;            // for SURF_UNDERWATER
  121.     float    verts[4][VERTEXSIZE];    // variable sized (xyz s1t1 s2t2)
  122. } glpoly_t;
  123.  
  124. typedef struct msurface_s
  125. {
  126.     int            visframe;        // should be drawn when node is crossed
  127.  
  128.     mplane_t    *plane;
  129.     int            flags;
  130.  
  131.     int            firstedge;    // look up in model->surfedges[], negative numbers
  132.     int            numedges;    // are backwards edges
  133.     
  134.     short        texturemins[2];
  135.     short        extents[2];
  136.  
  137.     int            light_s, light_t;    // gl lightmap coordinates
  138.  
  139.     glpoly_t    *polys;                // multiple if warped
  140.     struct    msurface_s    *texturechain;
  141.  
  142.     mtexinfo_t    *texinfo;
  143.     
  144. // lighting info
  145.     int            dlightframe;
  146.     int            dlightbits;
  147.  
  148.     int            lightmaptexturenum;
  149.     byte        styles[MAXLIGHTMAPS];
  150.     int            cached_light[MAXLIGHTMAPS];    // values currently used in lightmap
  151.     qboolean    cached_dlight;                // true if dynamic light in cache
  152.     byte        *samples;        // [numstyles*surfsize]
  153. } msurface_t;
  154.  
  155. typedef struct mnode_s
  156. {
  157. // common with leaf
  158.     int            contents;        // 0, to differentiate from leafs
  159.     int            visframe;        // node needs to be traversed if current
  160.     
  161.     float        minmaxs[6];        // for bounding box culling
  162.  
  163.     struct mnode_s    *parent;
  164.  
  165. // node specific
  166.     mplane_t    *plane;
  167.     struct mnode_s    *children[2];    
  168.  
  169.     unsigned short        firstsurface;
  170.     unsigned short        numsurfaces;
  171. } mnode_t;
  172.  
  173.  
  174.  
  175. typedef struct mleaf_s
  176. {
  177. // common with node
  178.     int            contents;        // wil be a negative contents number
  179.     int            visframe;        // node needs to be traversed if current
  180.  
  181.     float        minmaxs[6];        // for bounding box culling
  182.  
  183.     struct mnode_s    *parent;
  184.  
  185. // leaf specific
  186.     byte        *compressed_vis;
  187.     efrag_t        *efrags;
  188.  
  189.     msurface_t    **firstmarksurface;
  190.     int            nummarksurfaces;
  191.     int            key;            // BSP sequence number for leaf's contents
  192.     byte        ambient_sound_level[NUM_AMBIENTS];
  193. } mleaf_t;
  194.  
  195. // !!! if this is changed, it must be changed in asm_i386.h too !!!
  196. typedef struct
  197. {
  198.     dclipnode_t    *clipnodes;
  199.     mplane_t    *planes;
  200.     int            firstclipnode;
  201.     int            lastclipnode;
  202.     vec3_t        clip_mins;
  203.     vec3_t        clip_maxs;
  204. } hull_t;
  205.  
  206. /*
  207. ==============================================================================
  208.  
  209. SPRITE MODELS
  210.  
  211. ==============================================================================
  212. */
  213.  
  214.  
  215. // FIXME: shorten these?
  216. typedef struct mspriteframe_s
  217. {
  218.     int        width;
  219.     int        height;
  220.     float    up, down, left, right;
  221.     int        gl_texturenum;
  222. } mspriteframe_t;
  223.  
  224. typedef struct
  225. {
  226.     int                numframes;
  227.     float            *intervals;
  228.     mspriteframe_t    *frames[1];
  229. } mspritegroup_t;
  230.  
  231. typedef struct
  232. {
  233.     spriteframetype_t    type;
  234.     mspriteframe_t        *frameptr;
  235. } mspriteframedesc_t;
  236.  
  237. typedef struct
  238. {
  239.     int                    type;
  240.     int                    maxwidth;
  241.     int                    maxheight;
  242.     int                    numframes;
  243.     float                beamlength;        // remove?
  244.     void                *cachespot;        // remove?
  245.     mspriteframedesc_t    frames[1];
  246. } msprite_t;
  247.  
  248.  
  249. /*
  250. ==============================================================================
  251.  
  252. ALIAS MODELS
  253.  
  254. Alias models are position independent, so the cache manager can move them.
  255. ==============================================================================
  256. */
  257.  
  258. typedef struct
  259. {
  260.     int                    firstpose;
  261.     int                    numposes;
  262.     float                interval;
  263.     trivertx_t            bboxmin;
  264.     trivertx_t            bboxmax;
  265.     int                    frame;
  266.     char                name[16];
  267. } maliasframedesc_t;
  268.  
  269. typedef struct
  270. {
  271.     trivertx_t            bboxmin;
  272.     trivertx_t            bboxmax;
  273.     int                    frame;
  274. } maliasgroupframedesc_t;
  275.  
  276. typedef struct
  277. {
  278.     int                        numframes;
  279.     int                        intervals;
  280.     maliasgroupframedesc_t    frames[1];
  281. } maliasgroup_t;
  282.  
  283. // !!! if this is changed, it must be changed in asm_draw.h too !!!
  284. typedef struct mtriangle_s {
  285.     int                    facesfront;
  286.     int                    vertindex[3];
  287. } mtriangle_t;
  288.  
  289.  
  290. #define    MAX_SKINS    32
  291. typedef struct {
  292.     int            ident;
  293.     int            version;
  294.     vec3_t        scale;
  295.     vec3_t        scale_origin;
  296.     float        boundingradius;
  297.     vec3_t        eyeposition;
  298.     int            numskins;
  299.     int            skinwidth;
  300.     int            skinheight;
  301.     int            numverts;
  302.     int            numtris;
  303.     int            numframes;
  304.     synctype_t    synctype;
  305.     int            flags;
  306.     float        size;
  307.  
  308.     int                    numposes;
  309.     int                    poseverts;
  310.     int                    posedata;    // numposes*poseverts trivert_t
  311.     int                    commands;    // gl command list with embedded s/t
  312.     int                    gl_texturenum[MAX_SKINS][4];
  313.     int                    texels[MAX_SKINS];    // only for player skins
  314.     maliasframedesc_t    frames[1];    // variable sized
  315. } aliashdr_t;
  316.  
  317. #define    MAXALIASVERTS    1024
  318. #define    MAXALIASFRAMES    256
  319. #define    MAXALIASTRIS    2048
  320. extern    aliashdr_t    *pheader;
  321. extern    stvert_t    stverts[MAXALIASVERTS];
  322. extern    mtriangle_t    triangles[MAXALIASTRIS];
  323. extern    trivertx_t    *poseverts[MAXALIASFRAMES];
  324.  
  325. //===================================================================
  326.  
  327. //
  328. // Whole model
  329. //
  330.  
  331. typedef enum {mod_brush, mod_sprite, mod_alias} modtype_t;
  332.  
  333. #define    EF_ROCKET    1            // leave a trail
  334. #define    EF_GRENADE    2            // leave a trail
  335. #define    EF_GIB        4            // leave a trail
  336. #define    EF_ROTATE    8            // rotate (bonus items)
  337. #define    EF_TRACER    16            // green split trail
  338. #define    EF_ZOMGIB    32            // small blood trail
  339. #define    EF_TRACER2    64            // orange split trail + rotate
  340. #define    EF_TRACER3    128            // purple trail
  341.  
  342. typedef struct model_s
  343. {
  344.     char        name[MAX_QPATH];
  345.     qboolean    needload;        // bmodels and sprites don't cache normally
  346.  
  347.     modtype_t    type;
  348.     int            numframes;
  349.     synctype_t    synctype;
  350.     
  351.     int            flags;
  352.  
  353. //
  354. // volume occupied by the model graphics
  355. //        
  356.     vec3_t        mins, maxs;
  357.     float        radius;
  358.  
  359. //
  360. // solid volume for clipping 
  361. //
  362.     qboolean    clipbox;
  363.     vec3_t        clipmins, clipmaxs;
  364.  
  365. //
  366. // brush model
  367. //
  368.     int            firstmodelsurface, nummodelsurfaces;
  369.  
  370.     int            numsubmodels;
  371.     dmodel_t    *submodels;
  372.  
  373.     int            numplanes;
  374.     mplane_t    *planes;
  375.  
  376.     int            numleafs;        // number of visible leafs, not counting 0
  377.     mleaf_t        *leafs;
  378.  
  379.     int            numvertexes;
  380.     mvertex_t    *vertexes;
  381.  
  382.     int            numedges;
  383.     medge_t        *edges;
  384.  
  385.     int            numnodes;
  386.     mnode_t        *nodes;
  387.  
  388.     int            numtexinfo;
  389.     mtexinfo_t    *texinfo;
  390.  
  391.     int            numsurfaces;
  392.     msurface_t    *surfaces;
  393.  
  394.     int            numsurfedges;
  395.     int            *surfedges;
  396.  
  397.     int            numclipnodes;
  398.     dclipnode_t    *clipnodes;
  399.  
  400.     int            nummarksurfaces;
  401.     msurface_t    **marksurfaces;
  402.  
  403.     hull_t        hulls[MAX_MAP_HULLS];
  404.  
  405.     int            numtextures;
  406.     texture_t    **textures;
  407.  
  408.     byte        *visdata;
  409.     byte        *lightdata;
  410.     char        *entities;
  411.  
  412. //
  413. // additional model data
  414. //
  415.     cache_user_t    cache;        // only access through Mod_Extradata
  416.  
  417. } model_t;
  418.  
  419. //============================================================================
  420.  
  421. void    Mod_Init (void);
  422. void    Mod_ClearAll (void);
  423. model_t *Mod_ForName (char *name, qboolean crash);
  424. void    *Mod_Extradata (model_t *mod);    // handles caching
  425. void    Mod_TouchModel (char *name);
  426.  
  427. mleaf_t *Mod_PointInLeaf (float *p, model_t *model);
  428. byte    *Mod_LeafPVS (mleaf_t *leaf, model_t *model);
  429.  
  430. #endif    // __MODEL__
  431.